#include <stdio.h>

/*
 * factorial (阶乘)
 *
 * 类似文章:
 * tecknic\book-sotfware\ASM\论程序底层优化的一些方法与技巧.pdf
 */


/* 禁止GCC内联 */
__attribute__((noinline))
int calc(int n)
{
    int fact = 1;
    int i;

    for (i = 1; i < n; i+=4) {
        fact *= i;
        fact *= i + 1;
        fact *= i + 2;
        fact *= i + 3;
    }

    return fact;
}

int main()
{
    return calc(1000000000);
}

#if 0

    也通过循环展开，减少了无用指令，也减少了热点路径上分支跳转引起的流水线控制冲突，但它同时引入了数据依赖，
    进而导致流水线冲突，仍然无法发挥流水线和superscalar的指令级并行执行的能力！

#endif
